﻿using System;
using XLua;
#if USE_UNI_LUA
using LuaAPI = UniLua.Lua;
using RealStatePtr = UniLua.ILuaState;
using LuaCSFunction = UniLua.CSharpFunctionDelegate;
#else
using LuaAPI = XLua.LuaDLL.Lua;
using RealStatePtr = System.IntPtr;
using LuaCSFunction = XLua.LuaDLL.lua_CSFunction;
#endif

namespace XLua.CSObjectWrap
{
    public class TutorialCSCallLuaItfDBridge : LuaBase, Tutorial.CSCallLua.ItfD
    {
        public static LuaBase __Create(int reference, LuaEnv luaenv)
        {
            return new TutorialCSCallLuaItfDBridge(reference, luaenv);
        }

        public TutorialCSCallLuaItfDBridge(int reference, LuaEnv luaenv)
            : base(reference, luaenv) { }

        int Tutorial.CSCallLua.ItfD.add(int a, int b)
        {
#if THREAD_SAFE || HOTFIX_ENABLE
            lock (luaEnv.luaEnvLock)
            {
#endif
                RealStatePtr L = luaEnv.L;
                int err_func = LuaAPI.load_error_func(L, luaEnv.errorFuncRef);

                LuaAPI.lua_getref(L, luaReference);
                LuaAPI.xlua_pushasciistring(L, "add");
                if (0 != LuaAPI.xlua_pgettable(L, -2))
                {
                    luaEnv.ThrowExceptionFromError(err_func - 1);
                }
                if (!LuaAPI.lua_isfunction(L, -1))
                {
                    LuaAPI.xlua_pushasciistring(L, "no such function add");
                    luaEnv.ThrowExceptionFromError(err_func - 1);
                }
                LuaAPI.lua_pushvalue(L, -2);
                LuaAPI.lua_remove(L, -3);
                LuaAPI.xlua_pushinteger(L, a);
                LuaAPI.xlua_pushinteger(L, b);

                int __gen_error = LuaAPI.lua_pcall(L, 3, 1, err_func);
                if (__gen_error != 0)
                    luaEnv.ThrowExceptionFromError(err_func - 1);

                int __gen_ret = LuaAPI.xlua_tointeger(L, err_func + 1);
                LuaAPI.lua_settop(L, err_func - 1);
                return __gen_ret;
#if THREAD_SAFE || HOTFIX_ENABLE
            }
#endif
        }

        int Tutorial.CSCallLua.ItfD.f1
        {
            get
            {
#if THREAD_SAFE || HOTFIX_ENABLE
                lock (luaEnv.luaEnvLock)
                {
#endif
                    RealStatePtr L = luaEnv.L;
                    int oldTop = LuaAPI.lua_gettop(L);

                    LuaAPI.lua_getref(L, luaReference);
                    LuaAPI.xlua_pushasciistring(L, "f1");
                    if (0 != LuaAPI.xlua_pgettable(L, -2))
                    {
                        luaEnv.ThrowExceptionFromError(oldTop);
                    }
                    int __gen_ret = LuaAPI.xlua_tointeger(L, -1);
                    LuaAPI.lua_pop(L, 2);
                    return __gen_ret;
#if THREAD_SAFE || HOTFIX_ENABLE
                }
#endif
            }
            set
            {
#if THREAD_SAFE || HOTFIX_ENABLE
                lock (luaEnv.luaEnvLock)
                {
#endif
                    RealStatePtr L = luaEnv.L;
                    int oldTop = LuaAPI.lua_gettop(L);

                    LuaAPI.lua_getref(L, luaReference);
                    LuaAPI.xlua_pushasciistring(L, "f1");
                    LuaAPI.xlua_pushinteger(L, value);
                    if (0 != LuaAPI.xlua_psettable(L, -3))
                    {
                        luaEnv.ThrowExceptionFromError(oldTop);
                    }
                    LuaAPI.lua_pop(L, 1);
#if THREAD_SAFE || HOTFIX_ENABLE
                }
#endif
            }
        }

        int Tutorial.CSCallLua.ItfD.f2
        {
            get
            {
#if THREAD_SAFE || HOTFIX_ENABLE
                lock (luaEnv.luaEnvLock)
                {
#endif
                    RealStatePtr L = luaEnv.L;
                    int oldTop = LuaAPI.lua_gettop(L);

                    LuaAPI.lua_getref(L, luaReference);
                    LuaAPI.xlua_pushasciistring(L, "f2");
                    if (0 != LuaAPI.xlua_pgettable(L, -2))
                    {
                        luaEnv.ThrowExceptionFromError(oldTop);
                    }
                    int __gen_ret = LuaAPI.xlua_tointeger(L, -1);
                    LuaAPI.lua_pop(L, 2);
                    return __gen_ret;
#if THREAD_SAFE || HOTFIX_ENABLE
                }
#endif
            }
            set
            {
#if THREAD_SAFE || HOTFIX_ENABLE
                lock (luaEnv.luaEnvLock)
                {
#endif
                    RealStatePtr L = luaEnv.L;
                    int oldTop = LuaAPI.lua_gettop(L);

                    LuaAPI.lua_getref(L, luaReference);
                    LuaAPI.xlua_pushasciistring(L, "f2");
                    LuaAPI.xlua_pushinteger(L, value);
                    if (0 != LuaAPI.xlua_psettable(L, -3))
                    {
                        luaEnv.ThrowExceptionFromError(oldTop);
                    }
                    LuaAPI.lua_pop(L, 1);
#if THREAD_SAFE || HOTFIX_ENABLE
                }
#endif
            }
        }
    }
}
